有时候需要在现有的对象中添加信息,我们可用通过创建一个子类,用子类创建的对象替代原有的对象。这种方式需要新建一个类,而且有时候由于一些限制,无法创建子类。Objective-C中有一项强大的特性可以解决这个问题,那就是
关联对象
(Associated Objective)。
###使用方式
比如我们使用 UIAlertView 的时候,用户按下按钮之后,需要用 Delegate 来处理操作,这样每一个alertView的视图创建代码和按钮处理代码就要分开,如果 alertView 很多的时候就会显得很乱。
|
|
如果能在 alertView 创建的时候就把按钮所对应的逻辑操作通过 Block 设置好, 然后在 Delegate 中直接调取对应 alertView 的 Block 进行操作, 这样代码就清晰很多, 我们可以通过Associated Object
来给 alertView 添加临时的信息.
|
|
相关方法
现在我们来了解一下Associated Object
,
|
|
内存管理
objc_AssociationPolicy属性是用来Associated Object的储存策略, 对应@property 的关系如下:
objc_AssociationPolicy | @property |
---|---|
OBJC_ASSOCIATION_ASSIGN | assign |
OBJC_ASSOCIATION_RETAIN_NONATOMIC | nonatomatic, reatin |
OBJC_ASSOCIATION_COPY_NONATOMIC | nonatomic, copy |
OBJC_ASSOCIATION_RETAIN | retain |
OBJC_ASSOCIATION_COPY | copy |
使用 Block 的时候要注意设置存储策略来防止Retain Cycle
还有要注意的是, key 的类型为const void *key
, 所以这样设置比较好
|
|
想要 KVO 怎么办
通过 Associated Object 添加的 property 是不会发出 KVO 的,如果想要实现的话,只要手动调用willChangeValueForKey:
和didChangeValueForKey:
就可以了,参考一下 MJRefresh 的代码。
|
|
总结
- 可以通过 Associated Object 把两个对象连起来.
- 定义 Associated Object 时可以模仿@property 定义储存策略, 防止 Retain Cycle
- 只有在其他方法不奏效的时候才使用, 因为这种方法回来带难以查找的 bug
- 注意 KVO